Imports System.Data.SqlClient
Imports System.ComponentModel

Public Class cls_articulo_

    Implements ICloneable

#Region "Variables ..."
    Private int_idarticulo As Integer = 0
    Private str_codigo As String = ""
    Private str_nombre As String = ""
    Private str_descripcion As String = ""
    Private str_notas As String = ""
    Private int_idarticulorubro As Integer = 0
    Private bit_enventa As Boolean = False
    Private int_tipo As enu_tipo = enu_tipo.Mprima
    Private int_idunidad As Integer = 0
    Private int_idunidaddetalle As Integer = 0
    Private int_idregistro As Integer = 0
    Private dec_costo As Decimal = 0
    Private int_tipocosto As enu_tipocosto = 0
    Private str_pathimagen As String = ""
    Private bol_costobloqueado As Boolean = False
    Private int_idproveedor As Integer = 0
    Private str_url As String = 0
    Private dec_bulto As Decimal = 0
    Private str_nombreventa As String = ""
    Private str_nombrecorto As String = ""
    Private str_barcode As String = ""
    Private dec_iva As Decimal

    Private obj_registro As cls_registro_ = Nothing

    Private obj_articulorubro As cls_articulorubro_
    Private obj_unidad As cls_unidad_
    Private obj_unidaddetalle As cls_unidaddetalle_

    Private obj_proveedorArticulo_ As cls_proveedorarticulo_ = Nothing
    Private obj_articulocomposicionmaquinariatarea As cls_articulocomposicionmaquinariatarea_
    Private obj_articulocomposicionarticulo As cls_articulocomposicionarticulo_
    Private obj_articulocomposicionproceso As cls_articulocomposicionproceso_
    Private obj_proveedor As cls_proveedor_

    Private col_Items As Collections.Generic.List(Of cls_articulo_) = Nothing

    Public Enum enu_tipo As Integer
        Mprima = 0
        Componente = 1
        Articulo = 2
    End Enum

    Public Enum enu_tipocosto
        <Description("0  - Valor fijo.")> fijo = 0
        <Description("1  - Segun el proveedor seleccionado.")> proveedor = 1
        <Description("2  - Segun el proveedor de menor valor.")> proveedorMenor = 2
        <Description("3  - Segun el promedio de todos los proveedores.")> proveedorPromedio = 3
        <Description("4  - Segun el proveedor de mayor valor.")> proveedorMayor = 4
        <Description("5  - Segun la ultima compra.")> proveedorUltimo = 5
        <Description("6  - Segun la produccion de menor valor.")> produccionMenor = 6
        <Description("7  - Segun el promedio de todas las producciones.")> produccionPromedio = 7
        <Description("8  - Segun la produccion de mayor valor.")> produccionMayor = 8
        <Description("9  - Segun la ultima produccion.")> produccionUltimo = 9
        <Description("10 - Basado en la composicion del articulo.")> compuesto = 10
    End Enum
#End Region

    Public Overrides Function ToString() As String

        Select Case str_formatoCombos
            Case "Nombre#########(15) - sigla(5)"
                Return nombre.PadRight(15) & " - " & codigo.PadRight(5)
            Case "sigla(5) - Nombre#########(15)"
                Return codigo.PadRight(5) & " - " & nombre.PadRight(15)
            Case "Nombre - sigla"
                Return nombre & " - " & codigo
            Case "sigla - Nombre"
                Return codigo & " - " & nombre
            Case "Nombre"
                Return nombre
            Case Else
                Return codigo & " - " & nombre
        End Select
    End Function

#Region "Propiedades ..."
    ReadOnly Property This
        Get
            Return Me
        End Get
    End Property
    ReadOnly Property ThisDescripcion As String
        Get
            Return Me.ToString
        End Get
    End Property
    ReadOnly Property pKey
        Get
            Return idarticulo
        End Get
    End Property
    Property idarticulo() As Integer
        Get
            idarticulo = int_idarticulo
        End Get
        Set(ByVal value As Integer)
            int_idarticulo = value
        End Set
    End Property
    Property codigo() As String
        Get
            codigo = str_codigo
        End Get
        Set(ByVal value As String)
            str_codigo = value
        End Set
    End Property
    Property nombre() As String
        Get
            nombre = str_nombre
        End Get
        Set(ByVal value As String)
            str_nombre = value
        End Set
    End Property
    Property descripcion() As String
        Get
            descripcion = str_descripcion
        End Get
        Set(ByVal value As String)
            str_descripcion = value
        End Set
    End Property
    Property notas() As String
        Get
            notas = str_notas
        End Get
        Set(ByVal value As String)
            str_notas = value
        End Set
    End Property
    Property idarticulorubro() As Integer
        Get
            idarticulorubro = int_idarticulorubro
        End Get
        Set(ByVal value As Integer)
            int_idarticulorubro = value
        End Set
    End Property
    Property enventa() As Boolean
        Get
            enventa = bit_enventa
        End Get
        Set(ByVal value As Boolean)
            bit_enventa = value
        End Set
    End Property
    Property tipo() As enu_tipo
        Get
            tipo = int_tipo
        End Get
        Set(ByVal value As enu_tipo)
            int_tipo = value
        End Set
    End Property
    Property idunidad() As Integer
        Get
            idunidad = int_idunidad
        End Get
        Set(ByVal value As Integer)
            int_idunidad = value
        End Set
    End Property
    Property idregistro() As Integer
        Get
            idregistro = int_idregistro
        End Get
        Set(ByVal value As Integer)
            int_idregistro = value
        End Set
    End Property
    Property costobloqueado As Boolean
        Get
            costobloqueado = bol_costobloqueado
        End Get
        Set(ByVal value As Boolean)
            bol_costobloqueado = value
        End Set
    End Property
    Property idproveedor As Integer
        Get
            idproveedor = int_idproveedor
        End Get
        Set(ByVal value As Integer)
            int_idproveedor = value
        End Set
    End Property
    Property idunidaddetalle As Integer
        Get
            idunidaddetalle = int_idunidaddetalle
        End Get
        Set(ByVal value As Integer)
            int_idunidaddetalle = value
        End Set
    End Property
    Public Function costo(ByVal prm_valor As Decimal) As Decimal
        dec_costo = prm_valor
        Return prm_valor
    End Function
    Public Function costo() As Decimal
        Select Case tipocosto
            Case enu_tipocosto.fijo
                Return dec_costo
            Case Else
                Return CostoXIdarticulo(idarticulo, tipocosto, idproveedor)
        End Select
    End Function
    Public Function costo(ByVal prm_tipocosto As enu_tipocosto, Optional ByVal prm_idproveedor As Integer = 0) As Decimal
        Select Case prm_tipocosto
            Case enu_tipocosto.fijo
                Return dec_costo
            Case Else
                Return CostoXIdarticulo(idarticulo, prm_tipocosto, prm_idproveedor)
        End Select
    End Function
    Property iva As Decimal
        Get
            iva = dec_iva
        End Get
        Set(value As Decimal)
            dec_iva = value
        End Set
    End Property
    Property tipocosto As enu_tipocosto
        Get
            tipocosto = int_tipocosto
        End Get
        Set(ByVal value As enu_tipocosto)
            int_tipocosto = value
        End Set
    End Property
    Property pathimagen As String
        Get
            pathimagen = str_pathimagen
        End Get
        Set(ByVal value As String)
            str_pathimagen = value
        End Set
    End Property
    Property url As String
        Get
            url = str_url
        End Get
        Set(ByVal value As String)
            str_url = value
        End Set
    End Property
    Property bulto As Decimal
        Get
            bulto = dec_bulto
        End Get
        Set(ByVal value As Decimal)
            dec_bulto = value
        End Set
    End Property
    Property nombreventa As String
        Get
            nombreventa = str_nombreventa
        End Get
        Set(ByVal value As String)
            str_nombreventa = value
        End Set
    End Property
    Property nombrecorto As String
        Get
            nombrecorto = str_nombrecorto
        End Get
        Set(value As String)
            str_nombrecorto = value
        End Set
    End Property
    Property barcode As String
        Get
            barcode = str_barcode
        End Get
        Set(value As String)
            str_barcode = value
        End Set
    End Property
    Property proveedorArticulo_() As cls_proveedorarticulo_
        Get
            If IsNothing(obj_proveedorArticulo_) Then
                obj_proveedorArticulo_ = New cls_proveedorarticulo_
                If Not obj_proveedorArticulo_.CargarXidarticulo(idarticulo) Then
                    obj_proveedorArticulo_ = Nothing
                End If
            End If
            proveedorArticulo_ = obj_proveedorArticulo_
        End Get
        Set(ByVal value As cls_proveedorarticulo_)
            obj_proveedorArticulo_ = value
        End Set
    End Property
    Property registro() As cls_registro_
        Get
            If IsNothing(obj_registro) Then
                obj_registro = New cls_registro_
                If Not obj_registro.Buscar(idregistro) Then
                    obj_registro = Nothing
                End If
            End If
            registro = obj_registro
        End Get
        Set(ByVal value As cls_registro_)
            obj_registro = value
        End Set
    End Property
    Property unidaddetalle() As cls_unidaddetalle_
        Get
            If IsNothing(obj_unidaddetalle) Then
                obj_unidaddetalle = New cls_unidaddetalle_
                If Not obj_unidaddetalle.Buscar(idunidaddetalle) Then
                    obj_unidaddetalle = Nothing
                End If
            End If
            unidaddetalle = obj_unidaddetalle
        End Get
        Set(ByVal value As cls_unidaddetalle_)
            obj_unidaddetalle = value
        End Set
    End Property
    Property proveedor() As cls_proveedor_
        Get
            If IsNothing(obj_proveedor) Then
                obj_proveedor = New cls_proveedor_
                If Not obj_proveedor.Buscar(idproveedor) Then
                    obj_proveedor = Nothing
                End If
            End If
            proveedor = obj_proveedor
        End Get
        Set(ByVal value As cls_proveedor_)
            obj_proveedor = value
        End Set
    End Property
    Property articulocomposicionarticulo_() As cls_articulocomposicionarticulo_
        Get
            If IsNothing(obj_articulocomposicionarticulo) Then
                obj_articulocomposicionarticulo = New cls_articulocomposicionarticulo_
                If Not obj_articulocomposicionarticulo.CargarXidarticuloprimario(int_idarticulo) Then
                    obj_articulocomposicionarticulo = Nothing
                End If
            End If
            articulocomposicionarticulo_ = obj_articulocomposicionarticulo
        End Get
        Set(ByVal value As cls_articulocomposicionarticulo_)
            obj_articulocomposicionarticulo = value
        End Set
    End Property
    Property articulocomposicionproceso_() As cls_articulocomposicionproceso_
        Get
            If IsNothing(obj_articulocomposicionproceso) Then
                obj_articulocomposicionproceso = New cls_articulocomposicionproceso_
                If Not obj_articulocomposicionproceso.CargarXidarticuloprimario(int_idarticulo) Then
                    obj_articulocomposicionproceso = Nothing
                End If
            End If
            articulocomposicionproceso_ = obj_articulocomposicionproceso
        End Get
        Set(ByVal value As cls_articulocomposicionproceso_)
            obj_articulocomposicionproceso = value
        End Set
    End Property
    Property articulocomposicionmaquinariatarea_() As cls_articulocomposicionmaquinariatarea_
        Get
            If IsNothing(obj_articulocomposicionmaquinariatarea) Then
                obj_articulocomposicionmaquinariatarea = New cls_articulocomposicionmaquinariatarea_
                If Not obj_articulocomposicionmaquinariatarea.CargarXidarticuloprimario(int_idarticulo) Then
                    obj_articulocomposicionmaquinariatarea = Nothing
                End If
            End If
            articulocomposicionmaquinariatarea_ = obj_articulocomposicionmaquinariatarea
        End Get
        Set(ByVal value As cls_articulocomposicionmaquinariatarea_)
            obj_articulocomposicionmaquinariatarea = value
        End Set
    End Property
    Property articulorubro() As cls_articulorubro_
        Get
            If IsNothing(obj_articulorubro) Then
                obj_articulorubro = New cls_articulorubro_
                If Not obj_articulorubro.Buscar(idarticulorubro) Then
                    obj_articulorubro = Nothing
                End If
            End If
            articulorubro = obj_articulorubro
        End Get
        Set(ByVal value As cls_articulorubro_)
            obj_articulorubro = value
        End Set
    End Property

    Property unidad() As cls_unidad_
        Get
            If IsNothing(obj_unidad) Then
                obj_unidad = New cls_unidad_
                If Not obj_unidad.Buscar(idunidad) Then
                    obj_unidad = Nothing
                End If
            End If
            unidad = obj_unidad
        End Get
        Set(ByVal value As cls_unidad_)
            obj_unidad = value
        End Set
    End Property
    Property Items() As Collections.Generic.List(Of cls_articulo_)
        Get
            Items = col_Items
        End Get
        Set(ByVal value As Collections.Generic.List(Of cls_articulo_))
            col_Items = value
        End Set
    End Property
#End Region

    Private Sub CargarColeccion(ByVal obj_Reader As SqlDataReader)
        col_Items = New Collections.Generic.List(Of cls_articulo_)
        While obj_Reader.Read()
            Dim Elemento As New cls_articulo_
            Elemento.int_idarticulo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulo")))

            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("codigo"))) = False Then
                Elemento.str_codigo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("codigo")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre"))) = False Then
                Elemento.str_nombre = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion"))) = False Then
                Elemento.str_descripcion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("notas"))) = False Then
                Elemento.str_notas = (obj_Reader.GetValue(obj_Reader.GetOrdinal("notas")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulorubro"))) = False Then
                Elemento.int_idarticulorubro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulorubro")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("enventa"))) = False Then
                Elemento.bit_enventa = (obj_Reader.GetValue(obj_Reader.GetOrdinal("enventa")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo"))) = False Then
                Elemento.int_tipo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidad"))) = False Then
                Elemento.int_idunidad = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidad")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
                Elemento.int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("costo"))) = False Then
                Elemento.dec_costo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("costo")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipocosto"))) = False Then
                Elemento.int_tipocosto = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipocosto")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("pathimagen"))) = False Then
                Elemento.str_pathimagen = (obj_Reader.GetValue(obj_Reader.GetOrdinal("pathimagen")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("costobloqueado"))) = False Then
                Elemento.bol_costobloqueado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("costobloqueado")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idproveedor"))) = False Then
                Elemento.int_idproveedor = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idproveedor")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidaddetalle"))) = False Then
                Elemento.int_idunidaddetalle = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidaddetalle")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("url"))) = False Then
                Elemento.str_url = (obj_Reader.GetValue(obj_Reader.GetOrdinal("url")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("bulto"))) = False Then
                Elemento.dec_bulto = (obj_Reader.GetValue(obj_Reader.GetOrdinal("bulto")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombreventa"))) = False Then
                Elemento.str_nombreventa = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombreventa")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrecorto"))) = False Then
                Elemento.str_nombrecorto = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrecorto")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("barcode"))) = False Then
                Elemento.str_barcode = (obj_Reader.GetValue(obj_Reader.GetOrdinal("barcode")))
            End If
            If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("iva"))) = False Then
                Elemento.dec_iva = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iva")))
            End If

            col_Items.Add(Elemento)
        End While
    End Sub

    Private Sub CargarVariables(ByVal obj_Reader As SqlDataReader)
        obj_Reader.Read()
        int_idarticulo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulo")))

        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("codigo"))) = False Then
            str_codigo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("codigo")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre"))) = False Then
            str_nombre = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombre")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion"))) = False Then
            str_descripcion = (obj_Reader.GetValue(obj_Reader.GetOrdinal("descripcion")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("notas"))) = False Then
            str_notas = (obj_Reader.GetValue(obj_Reader.GetOrdinal("notas")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulorubro"))) = False Then
            int_idarticulorubro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idarticulorubro")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("enventa"))) = False Then
            bit_enventa = (obj_Reader.GetValue(obj_Reader.GetOrdinal("enventa")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo"))) = False Then
            int_tipo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipo")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidad"))) = False Then
            int_idunidad = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidad")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro"))) = False Then
            int_idregistro = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idregistro")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("costo"))) = False Then
            dec_costo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("costo")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("tipocosto"))) = False Then
            int_tipocosto = (obj_Reader.GetValue(obj_Reader.GetOrdinal("tipocosto")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("pathimagen"))) = False Then
            str_pathimagen = (obj_Reader.GetValue(obj_Reader.GetOrdinal("pathimagen")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("costobloqueado"))) = False Then
            bol_costobloqueado = (obj_Reader.GetValue(obj_Reader.GetOrdinal("costobloqueado")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idproveedor"))) = False Then
            int_idproveedor = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idproveedor")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidaddetalle"))) = False Then
            int_idunidaddetalle = (obj_Reader.GetValue(obj_Reader.GetOrdinal("idunidaddetalle")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("url"))) = False Then
            str_url = (obj_Reader.GetValue(obj_Reader.GetOrdinal("url")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("bulto"))) = False Then
            dec_bulto = (obj_Reader.GetValue(obj_Reader.GetOrdinal("bulto")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombreventa"))) = False Then
            str_nombreventa = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombreventa")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrecorto"))) = False Then
            str_nombrecorto = (obj_Reader.GetValue(obj_Reader.GetOrdinal("nombrecorto")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("barcode"))) = False Then
            str_barcode = (obj_Reader.GetValue(obj_Reader.GetOrdinal("barcode")))
        End If
        If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("iva"))) = False Then
            dec_iva = (obj_Reader.GetValue(obj_Reader.GetOrdinal("iva")))
        End If
    End Sub

    Public Function Nuevo(Optional ByVal ObtenerID As Boolean = False) As Boolean
        Nuevo = False
        Dim obj_Conexion As New cls_Conexion
        Try
            'Creacion de registro----------------------------------------------------
            If IsNothing(obj_registro) Then
                registro = New cls_registro_
                registro.fechacreado = Now
                registro.idusuariocreado = UsuarioLOG.idusuario
                registro.fechamodificado = Now
                registro.idusuariomodificado = UsuarioLOG.idusuario
                registro.idregistroestado = 1
                registro.idusuarioregistroestado = UsuarioLOG.idusuario
                registro.Nuevo(True)
                idregistro = obj_registro.idregistro
            End If
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__Nuevo"
                .Parameters.Add("@codigo", SqlDbType.NVarChar).Value = str_codigo
                .Parameters.Add("@nombre", SqlDbType.NVarChar).Value = str_nombre
                .Parameters.Add("@descripcion", SqlDbType.NVarChar).Value = str_descripcion
                .Parameters.Add("@notas", SqlDbType.NVarChar).Value = str_notas
                .Parameters.Add("@idarticulorubro", SqlDbType.Int).Value = int_idarticulorubro
                .Parameters.Add("@enventa", SqlDbType.Bit).Value = bit_enventa
                .Parameters.Add("@tipo", SqlDbType.Int).Value = int_tipo
                .Parameters.Add("@idunidad", SqlDbType.Int).Value = int_idunidad
                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .Parameters.Add("@costo", SqlDbType.Decimal).Value = dec_costo
                .Parameters.Add("@tipocosto", SqlDbType.Int).Value = int_tipocosto
                .Parameters.Add("@pathimagen", SqlDbType.NVarChar).Value = str_pathimagen
                .Parameters.Add("@costobloqueado", SqlDbType.Bit).Value = bol_costobloqueado
                .Parameters.Add("@idproveedor", SqlDbType.Int).Value = int_idproveedor
                .Parameters.Add("@idunidaddetalle", SqlDbType.Int).Value = int_idunidaddetalle
                .Parameters.Add("@url", SqlDbType.NVarChar).Value = str_url
                .Parameters.Add("@bulto", SqlDbType.Decimal).Value = dec_bulto
                .Parameters.Add("@nombreventa", SqlDbType.NVarChar).Value = str_nombreventa
                .Parameters.Add("@nombrecorto", SqlDbType.NVarChar).Value = str_nombrecorto
                .Parameters.Add("@barcode", SqlDbType.NVarChar).Value = str_barcode
                .Parameters.Add("@iva", SqlDbType.Decimal).Value = dec_iva
                .ExecuteNonQuery()
            End With
            Nuevo = True
            CargarUltimo()

            'Creacion de ProveedorArticulo--------------------------------------------------
            If Not IsNothing(proveedorArticulo_) Then
                If Not IsNothing(proveedorArticulo_.Items) Then
                    For Each proveedorarticulo As cls_proveedorarticulo_ In proveedorArticulo_.Items
                        proveedorarticulo.idarticulo = idarticulo
                        proveedorarticulo.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de Articuloarticulocomposicion---------------------------------------
            If Not IsNothing(articulocomposicionarticulo_) Then
                If Not IsNothing(articulocomposicionarticulo_.Items) Then
                    For Each articulocomposicionarticulo As cls_articulocomposicionarticulo_ In articulocomposicionarticulo_.Items
                        articulocomposicionarticulo.idarticuloprimario = idarticulo
                        articulocomposicionarticulo.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de Articulocomposicionmaquinariatarea_---------------------------------------
            If Not IsNothing(articulocomposicionmaquinariatarea_) Then
                If Not IsNothing(articulocomposicionmaquinariatarea_.Items) Then
                    For Each articulocomposicionmaquinariatarea As cls_articulocomposicionmaquinariatarea_ In articulocomposicionmaquinariatarea_.Items
                        articulocomposicionmaquinariatarea.idarticuloprimario = idarticulo
                        articulocomposicionmaquinariatarea.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion de Articuloarticulocomposicion---------------------------------------
            If Not IsNothing(articulocomposicionproceso_) Then
                If Not IsNothing(articulocomposicionproceso_.Items) Then
                    For Each articulocomposicionproceso As cls_articulocomposicionproceso_ In articulocomposicionproceso_.Items
                        articulocomposicionproceso.idarticuloprimario = idarticulo
                        articulocomposicionproceso.Nuevo(True)
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Crear el registro de articulo_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Function

    Public Sub Modificar()
        Dim obj_Conexion As New cls_Conexion
        Try
            'Modificacion de registro------------------------------------------------
            registro.fechamodificado = Now : registro.idusuariomodificado = UsuarioLOG.idusuario
            registro.Modificar()
            '------------------------------------------------------------------------

            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__Modificar"
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = int_idarticulo
                .Parameters.Add("@codigo", SqlDbType.NVarChar).Value = str_codigo
                .Parameters.Add("@nombre", SqlDbType.NVarChar).Value = str_nombre
                .Parameters.Add("@descripcion", SqlDbType.NVarChar).Value = str_descripcion
                .Parameters.Add("@notas", SqlDbType.NVarChar).Value = str_notas
                .Parameters.Add("@idarticulorubro", SqlDbType.Int).Value = int_idarticulorubro
                .Parameters.Add("@enventa", SqlDbType.Bit).Value = bit_enventa
                .Parameters.Add("@tipo", SqlDbType.Int).Value = int_tipo
                .Parameters.Add("@idunidad", SqlDbType.Int).Value = int_idunidad
                .Parameters.Add("@idregistro", SqlDbType.Int).Value = int_idregistro
                .Parameters.Add("@costo", SqlDbType.Decimal).Value = dec_costo
                .Parameters.Add("@tipocosto", SqlDbType.Int).Value = int_tipocosto
                .Parameters.Add("@pathimagen", SqlDbType.NVarChar).Value = str_pathimagen
                .Parameters.Add("@costobloqueado", SqlDbType.Bit).Value = bol_costobloqueado
                .Parameters.Add("@idproveedor", SqlDbType.Int).Value = int_idproveedor
                .Parameters.Add("@idunidaddetalle", SqlDbType.Int).Value = int_idunidaddetalle
                .Parameters.Add("@url", SqlDbType.NVarChar).Value = str_url
                .Parameters.Add("@bulto", SqlDbType.Decimal).Value = dec_bulto
                .Parameters.Add("@nombreventa", SqlDbType.NVarChar).Value = str_nombreventa
                .Parameters.Add("@nombrecorto", SqlDbType.NVarChar).Value = str_nombrecorto
                .Parameters.Add("@barcode", SqlDbType.NVarChar).Value = str_barcode
                .Parameters.Add("@iva", SqlDbType.Decimal).Value = dec_iva
                .ExecuteNonQuery()
            End With

            'Creacion/modificacion de proveedorarticulo-------------------------------------
            If Not IsNothing(proveedorArticulo_) Then
                If Not IsNothing(proveedorArticulo_.Items) Then
                    For Each proveedorArticulo As cls_proveedorarticulo_ In proveedorArticulo_.Items
                        If proveedorArticulo.idproveedorarticulo = 0 Then
                            proveedorArticulo.idarticulo = idarticulo
                            proveedorArticulo.Nuevo(True)
                        Else
                            proveedorArticulo.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion/modificacion de articulocomposicionarticulo-------------------------------------
            If Not IsNothing(articulocomposicionarticulo_) Then
                If Not IsNothing(articulocomposicionarticulo_.Items) Then
                    For Each articulocomposicionarticulo As cls_articulocomposicionarticulo_ In articulocomposicionarticulo_.Items
                        If articulocomposicionarticulo.idarticulocomposicionarticulo = 0 Then
                            articulocomposicionarticulo.idarticuloprimario = idarticulo
                            articulocomposicionarticulo.Nuevo(True)
                        Else
                            articulocomposicionarticulo.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion/modificacion de articulocomposicionproceso-------------------------------------
            If Not IsNothing(articulocomposicionproceso_) Then
                If Not IsNothing(articulocomposicionproceso_.Items) Then
                    For Each articulocomposicionproceso As cls_articulocomposicionproceso_ In articulocomposicionproceso_.Items
                        If articulocomposicionproceso.idarticulocomposicionproceso = 0 Then
                            articulocomposicionproceso.idarticuloprimario = idarticulo
                            articulocomposicionproceso.Nuevo(True)
                        Else
                            articulocomposicionproceso.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

            'Creacion/modificacion de articulocomposicionmaquinariatarea-------------------------------------
            If Not IsNothing(articulocomposicionmaquinariatarea_) Then
                If Not IsNothing(articulocomposicionmaquinariatarea_.Items) Then
                    For Each articulocomposicionmaquinariatarea As cls_articulocomposicionmaquinariatarea_ In articulocomposicionmaquinariatarea_.Items
                        If articulocomposicionmaquinariatarea.idarticulocomposicionmaquinariatarea = 0 Then
                            articulocomposicionmaquinariatarea.idarticuloprimario = idarticulo
                            articulocomposicionmaquinariatarea.Nuevo(True)
                        Else
                            articulocomposicionmaquinariatarea.Modificar()
                        End If
                    Next
                End If
            End If
            '-------------------------------------------------------------------------

        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Modificar el registro de articulo_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Sub Eliminar(ByVal idarticulo As Integer)
        Dim obj_Conexion As New cls_Conexion
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__Eliminar"
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = idarticulo
                .ExecuteNonQuery()
            End With
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Eliminar el registro de articulo_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
        End Try
    End Sub

    Public Function Buscar(ByVal idarticulo As Integer) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            Buscar = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__Buscar"
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = idarticulo
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
                Buscar = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al Buscar el registro de articulo_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Sub CargarUltimo()
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__CargarUltimo"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarVariables(obj_Reader)
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarUltimo registro de articulo_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Sub

    Public Function CargarTodos(Optional ByVal idregistroestado As Integer = 1) As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarTodos = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__CargarTodos"
                .Parameters.Add("@idregistroestado", SqlDbType.Int).Value = idregistroestado
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarTodos = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarTodos los registros de articulo_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function CargarTodosEnventa() As Boolean
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            CargarTodosEnventa = False
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__CargarTodosEnventa"
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                CargarColeccion(obj_Reader)
                CargarTodosEnventa = True
            End If
        Catch ex As SqlClient.SqlException
            Throw New Exception("Error al CargarTodosEnventa los registros de articulo_." & Chr(13) & _
           "Por favor informe del siguiente detalle técnico:" & Chr(13) & _
           "Nro de error: " & ex.ErrorCode & "." & Chr(13) & _
           "Descripción: " & ex.Message)
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function Clone() As Object Implements System.ICloneable.Clone
        Dim obj_articulo_Clon As New cls_articulo_
        obj_articulo_Clon.int_idarticulo = Me.int_idarticulo
        obj_articulo_Clon.str_codigo = Me.str_codigo
        obj_articulo_Clon.str_nombre = Me.str_nombre
        obj_articulo_Clon.str_descripcion = Me.str_descripcion
        obj_articulo_Clon.str_notas = Me.str_notas
        obj_articulo_Clon.int_idarticulorubro = Me.int_idarticulorubro
        obj_articulo_Clon.bit_enventa = Me.bit_enventa
        obj_articulo_Clon.int_tipo = Me.int_tipo
        obj_articulo_Clon.int_idunidad = Me.int_idunidad
        obj_articulo_Clon.int_idregistro = Me.int_idregistro
        obj_articulo_Clon.dec_costo = Me.dec_costo
        obj_articulo_Clon.int_tipocosto = Me.int_tipocosto
        obj_articulo_Clon.str_pathimagen = Me.str_pathimagen
        obj_articulo_Clon.bol_costobloqueado = Me.bol_costobloqueado
        obj_articulo_Clon.int_idproveedor = Me.int_idproveedor
        obj_articulo_Clon.int_idunidaddetalle = Me.int_idunidaddetalle
        obj_articulo_Clon.str_url = Me.str_url
        obj_articulo_Clon.dec_bulto = Me.dec_bulto
        obj_articulo_Clon.str_nombreventa = Me.str_nombreventa
        obj_articulo_Clon.str_nombrecorto = Me.str_nombrecorto
        obj_articulo_Clon.str_barcode = Me.str_barcode
        obj_articulo_Clon.dec_iva = Me.dec_iva
        obj_articulo_Clon.col_Items = Me.col_Items
        Return obj_articulo_Clon
    End Function

    Public Function CostoXIdarticulo(ByVal prm_idarticulo As Integer, ByVal prm_tipocosto As enu_tipocosto, ByVal prm_idproveedor As Integer) As Decimal
        CostoXIdarticulo = 0
        Dim obj_Conexion As New cls_Conexion
        Dim obj_Reader As SqlDataReader
        Try
            obj_Conexion.Conectar()
            With obj_Conexion.obj_SqlCommand
                .CommandType = CommandType.StoredProcedure
                .Connection = obj_Conexion.obj_SqlConnection
                .CommandText = "articulo__Costo"
                .Parameters.Add("@idarticulo", SqlDbType.Int).Value = prm_idarticulo
                .Parameters.Add("@tipocosto", SqlDbType.Int).Value = prm_tipocosto
                .Parameters.Add("@idproveedor", SqlDbType.Int).Value = prm_idproveedor
            End With
            obj_Reader = obj_Conexion.obj_SqlCommand.ExecuteReader
            If obj_Reader.HasRows Then
                obj_Reader.Read()
                If IsDBNull(obj_Reader.GetValue(obj_Reader.GetOrdinal("costo"))) = False Then
                    CostoXIdarticulo = (obj_Reader.GetValue(obj_Reader.GetOrdinal("costo")))
                End If
            End If
        Catch ex As SqlClient.SqlException
        Finally
            obj_Conexion.Desconectar()
            obj_Conexion = Nothing
            obj_Reader = Nothing
        End Try
    End Function

    Public Function valorListaGeneral()

    End Function
End Class
